﻿using System;
using Sinacor.Infra.Common;
using System.Collections.Generic;
using Sinacor.Servico.Bovespa.Cliente.BusinessEntity;
using Sinacor.Servico.Bovespa.Cliente.Service.DataContract.Request;

namespace Sinacor.Servico.Bovespa.Cliente.Service.ServiceImplementation.Translator.BusinessEntityToDataContract
{

    //Task : 5617
    //Data : 19/03/2009
    //Autor: APsilva
    /// <summary>
    /// Translator de Cliente 
    /// </summary>
    public class Cliente
    {
        #region Métodos
        public DataContract.Response.ClienteResponse ToClienteResponse(BusinessEntity.Cliente from)
        {
            DataContract.Response.ClienteResponse to = new DataContract.Response.ClienteResponse();
            if (from != null)
            {
                switch (from.TipoPessoa)
                {
                    case Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Enum.TipoPessoa.Fisica:
                        to.TipoPessoa = Sinacor.Servico.Bovespa.Cliente.Service.DataContract.Enum.TipoPessoa.Fisica;
                        break;
                    case Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Enum.TipoPessoa.Juridica:
                        to.TipoPessoa = Sinacor.Servico.Bovespa.Cliente.Service.DataContract.Enum.TipoPessoa.Juridica;
                        break;
                }

                to.CodigoCustodiante = from.CodigoCustodiante;
                to.CodigoGrupo = from.CodigoGrupo;
                switch (from.Situacao)
                {
                    case Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Enum.TipoSituacao.Ativo:
                        to.Situacao = Sinacor.Servico.Bovespa.Cliente.Service.DataContract.Enum.TipoSituacao.Ativo;
                        break;
                    case Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Enum.TipoSituacao.Inativo:
                        to.Situacao = Sinacor.Servico.Bovespa.Cliente.Service.DataContract.Enum.TipoSituacao.Inativo;
                        break;
                }

                to.Codigo = from.Codigo;
                to.DigitoVerificador = from.Digito;
                to.Apelido = from.Apelido;
                to.Nome = from.Nome;
                to.NomeResumido = from.NomeResumido;
                to.ComplementoNome = from.ComplementoNome;
                to.ClienteContaInvestimento = from.ClienteContaInvestimento;
                to.CPFCNPJ = from.CPFCNPJ;
                if (from.CPFCNPJ.HasValue)
                    to.CPFCNPJTexto = from.CPFCNPJ.Value.ToString(); //Incluido CPFCNPJTexto para contornar erro na exportacao do DataGrid para Excel - esertorio - 200805132318 - ref issue ID0004794
                to.DataNascimentoFundacao = from.DataNascimentoFundacao;
                to.Dependencia = from.Dependencia;
                //to.ContaMae = from.ContaMae; //Excluido - Eduardo Sertorio e Ludmilla Modesto - 20080103
                to.CodigoOperacionalCVM = from.CodigoOperacionalCVM;
                to.isClienteQualificado = from.isClienteQualificado;
                to.isClienteBroker = from.isClienteBroker;
                
                to.Origem = from.Origem;
                to.Assessor = from.Assessor;
                to.ContaMae = from.ContaMae;
                to.TransmissaoOrdem = (DataContract.Enum.TipoTransmissaoOrdem?)from.TransmissaoOrdem;
                to.Situacao = (DataContract.Enum.TipoSituacao?)from.Situacao;
                to.ClienteBroker = from.CodigoClienteBroker; //Equivalente ContaMae - 20080103 - TSCCLIBOL.CD_CLIENTE_LIQFIN 
                to.isPessoaVinculada = from.isPessoaVinculada;

                to.PosicaoContasCorrente = Translator.
                    TranslateBetweenPosicaoContasCorrenteResponseAndPosicaoContasCorrente.
                    TranslatePosicaoContasCorrenteToPosicaoContasCorrenteResponse(from.PosicaoContasCorrente);

                to.PosicaoCustodia = Translator.
                    TranslateBetweenPosicaoCustodiaResponseAndPosicaoCustodia.
                    TranslatePosicaoCustodiaToPosicaoCustodiaResponse(from.PosicaoCustodia);

                to.BancoContaCorrente = Translator.
                    TranslateBetweenContaBancoResponseAndDadosBancarios.
                    TranslateDadosBancariosToContaBancoResponse(from.BancoContaCorrente);

                to.BancoDividendo = Translator.
                    TranslateBetweenContaBancoResponseAndDadosBancarios.
                    TranslateDadosBancariosToContaBancoResponse(from.BancoDividendo);

                if ((from.LimitesOperacionais != null) && (from.LimitesOperacionais.Count != 0))
                {
                    to.LimitesOperacionais = new List<System.Decimal>();
                    foreach (System.Decimal itemFrom in from.LimitesOperacionais)
                    {
                        to.LimitesOperacionais.Add(itemFrom);
                    }
                }

                if ((from.Endereco != null) && (from.Endereco.Count != 0))
                {
                    to.Endereco = new List<DataContract.Response.EnderecoResponse>();
                    foreach (BusinessEntity.Endereco beEndereco in from.Endereco)
                    {
                        to.Endereco.Add(Translator.TranslateBetweenEnderecoAndEnderecoResponse.
                        TranslateEnderecoToEnderecoResponse(beEndereco));
                    }
                }

                if ((from.Telefone != null) && (from.Telefone.Count != 0))
                {
                    to.Telefone = new List<DataContract.Response.TelefoneResponse>();
                    foreach (BusinessEntity.Telefone beTelefone in from.Telefone)
                    {
                        to.Telefone.Add(Translator.TranslateBetweenNumeroTelefoneResponseAndNumeroTelefone.
                            TranslateNumeroTelefoneToNumeroTelefoneResponse(beTelefone));
                    }
                }

                if (from.Bloqueio != null)
                {
                    to.TipoBloqueio = from.Bloqueio.TipoBloqueio;
                    to.DescricaoBloqueio = from.Bloqueio.DescricaoBloqueio;
                    to.isBloqueado = from.Bloqueio.isBloqueado;
                }

                to.TipoLiquidacao = (DataContract.Enum.TipoLiquidacao?)from.TipoLiquidacao; //Incluido - Eduardo Sertorio - 20070103
                to.PercentualReducaoAcrescimo = from.PercentualReducaoAcrescimo; //Incluido - Eduardo Sertorio - 20070103
                to.CodigoClienteInstitucional = from.CodigoClienteInstitucional; //Incluido - Eduardo Sertorio - 20080111
                to.PercentualTotal = from.PercentualTotal; //Incluido - Eduardo Sertorio - 20080111
                to.isClienteQualificado = from.isClienteQualificado; //Incluido - Eduardo Sertorio - 20080111
                to.isOperacaoCarteiraCliente = from.isOperacaoCarteiraCliente; //Incluido - Eduardo Sertorio - 20080111
                to.CodigoCarteira = from.Carteira; //Incluido - Eduardo Sertorio - 20080212

                to.isClienteBroker = from.isClienteBroker; //incluido para indicar Tipo de Ordem Financiamento - esertorio - 200804161636 - ref issue ID0003219

                //20080421 16:38 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
                to.DigitoClienteContaInvestimento = from.DigitoClienteContaInvestimento;
                //20080421 16:38 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
                to.ClienteContaDeposito = from.ClienteContaDeposito;
                //20080421 16:38 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
                to.DigitoClienteContaDeposito = from.DigitoClienteContaDeposito;
                //20080421 16:38 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
                to.IsContaInvestimento = from.IsContaInvestimento;

                //20081017 - RSCATULIN
                to.IsAdministradoConcorrente = from.IsAdministradoConcorrente;
            }
            return to;

        }


        /// <summary>
        /// Traduz BusinessEntity.ResultadoValidacaoCliente para DataContract.Response.ResultadoValidacaoClienteResponse
        /// </summary>
        /// <param name="from">BusinessEntity.ResultadoValidacaoCliente</param>
        /// <returns>DataContract.Response.ResultadoValidacaoClienteResponse</returns>
        public DataContract.Response.ResultadoValidacaoClienteResponse ToResultadoValidacaoClienteResponse(BusinessEntity.ResultadoValidacaoCliente from) 
        {
            DataContract.Response.ResultadoValidacaoClienteResponse to = new Sinacor.Servico.Bovespa.Cliente.Service.DataContract.Response.ResultadoValidacaoClienteResponse();
            to.ApelidoCliente = from.ApelidoCliente;
            to.Resultado = new Sinacor.Infra.Common.Validation.ValidationResult();
            to.Resultado.Error = from.Resultado.Error;
            to.Resultado.IsValid = from.Resultado.IsValid;
            return to;
        }

        #endregion
    }
}
